/*
 ============================================================================
 文件名    : Engine.h
 描述     : 引擎类声明.
 ============================================================================
 */
#ifndef CENGINE_H_
#define CENGINE_H_

// 引用
#include "GameObserver.h"
#include "WoodenBall.h"
#include "Line.h"

// 引擎状态
const TInt KGameNew = -1;
const TInt KGameOver = 0;
const TInt KGamePaused = 1;
const TInt KGameStarted = 2;

//类声明
/*
 * CEngine 类
 * 声明了游戏引擎类
 * 使用活动对象实现了一个状态机
 */
class CEngine: public CActive
	{

public:
    // 返回单体实例
	static CEngine* Instance();
	// 销毁单体实例
	static void Destroy();

public:
    //　注册观察者
	void AttachObserver( MGameObserver* aObserver );
	// 移除所有观察者
	void DetachObservers();
	CBall* GetBall();
	CLine* GetLine();
	TRect GetGameRoom();
	//　初始化引擎参数
	void Initialize();
	// 在暂停和运行状态之间互相切换
	void PauseOrResume();
	// 引擎从运行状态切换至下一个状态
	void Next();

public: // 继承自CActive
	void RunL();
	void DoCancel();
	TInt RunError( TInt aError );

private: // 隐藏构造方法和析构方法
	CEngine();
	~CEngine();
	void ConstructL();

private:
    // 游戏结束判断
	TBool GameOver();

private:
    // 单体对象
	static CEngine* iEngine;
	// 小球
	CBall* iBall;
	// 用户画出的线
	CLine* iLine;
	// 左边界和右边界
	CLine* iLeft, *iRight;
	// 当前游戏状态
	TInt iGameState;
	// 观察者列表
	RPointerArray<MGameObserver> iObservers;
	// 调节游戏速度的参数
	TInt iSpeedTune;
	// 游戏空间
	TRect iGameRoom;
	};

#endif /* CENGINE_H_ */
